package variables

import (
	"fmt"
	"unsafe"
)

/*常量使用const关键字定义，类型可有可无*/
const LENGTH int = 20
const HEIGHT = 10
const (
	Unknown = 0
	Female  = 1
	Male    = 2
)
const (
	ca = "abc"
	cb = len(ca)
	//因为Golang中的sring内部实现由两部分组成，一部分是指向字符串起始地址的指针
	//另一部分是字符串的长度，两部分各是8字节，所以一共16字节
	cc = unsafe.Sizeof(ca)
)

/*iota在const关键字出现时将被重置为0(const内部的第一行之前)，  const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。
  在一个 const 组中仅仅有一个标示符在一行的时候，它将使用增长的 iota 取得前面的表达式并且再运用它，。
  在 Go 语言的 spec 中， 这就是所谓的隐性重复最后一个非空的表达式列表。
*/
const (
	a = iota //0
	b        //1
	c        //2
	d = "ha" //独立值，iota += 1
	e        //"ha"   iota += 1
	f = 100  //iota +=1
	g        //100  iota +=1
	h = iota //7,恢复计数
	i        //8
)

/*同一行的iota取值是一样的*/
const (
	Apple, Banana = iota + 1, iota + 2
	Cherimoya, Durian
	Elderberry, Fig
)

func Const() {
	calArea()
	constAsEnum()
}

func calArea() {
	var area = LENGTH * HEIGHT
	fmt.Printf("Area is %d\n", area)
}

func constAsEnum() {
	fmt.Println(ca, cb, cc)
	fmt.Println(a, b, c, d, e, f, g, h, i)
	fmt.Println(Apple, Banana, Cherimoya, Durian, Elderberry, Fig)
}
